package Util;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by sunwei on 2017/9/26
 * Time:9:53
 */
public class JdbcTest {
    public static void main(String[] args) throws SQLException {
         JdbcUtil jdbcUtil =new JdbcUtil();
        //获取连接
        jdbcUtil.getConnection();
        String sqlQuery="select userName from tbl_student where id = 2";
        String insert="insert into tbl_student VALUES(11,'5555','母大虫','女','体型很胖')";
        String update="update tbl_student SET PASSWORD='7777' where id = 5";
        String delete="delete from tbl_student where id = 6";
        //设置一个序列，用来存储解析的字段键值对
        final List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
        /*
        调用查询语句
         */
        jdbcUtil.findResult(sqlQuery, new SetParams() {
            @Override
            public void doSet(PreparedStatement preparedStatement)throws SQLException{
            }
        }, new ResultSetHandler() {
            @Override
            public void doHandler(ResultSet resultSet) throws SQLException {

                //获取元数据
                ResultSetMetaData metaData = resultSet.getMetaData();
                //得到字段个数
                int cols_len = metaData.getColumnCount();
                while (resultSet.next()){
                    Map<String,Object> map = new HashMap<String,Object>();
                    //循环获取字段名，以及字段的值
                    for(int i = 0; i <cols_len ; i++) {
                        /*
                        1. 在从ResultSetMetaDate获取列名时，要使用getColumnLabel，而不能用getColumnName:
                            原因在于：
                            getColumnLabel获取用于打印输出和显示的指定列的建议标
                            getColumnName获取指定列的名称
                            而select的结果集返回的是Label
                            所以此处只能用Label而不能用Name
                        2. 在使用ResultSet之前不能关闭Statement，否则会出现SqlException：
                            java.sql.SQLException: Operation not allowed after ResultSet closed
                         */
                        String cols_name = metaData.getColumnLabel(i+1);//获取字段名字,在这里要注意
                        Object cols_value= resultSet.getObject(cols_name);
                        if (cols_value==null) {
                              cols_value=" ";
                        }
                        map.put(cols_name,cols_value);
                    }
                    list.add(map);
                }
                for(Map<String ,Object> m : list) {
                    System.out.println(m);
                }
            }
        });
        jdbcUtil.releaseConn();
        /*
        调用更改语句,执行插入语句
         */
//        jdbcUtil.updateByPreparedStatement(insert, new SetParams() {
//            @Override
//            public void doSet(PreparedStatement preparedStatement) throws SQLException {
//            }
//        });
//        /*
//        调用函数，执行更新操作
//         */
//        jdbcUtil.updateByPreparedStatement(update, new SetParams() {
//            @Override
//            public void doSet(PreparedStatement preparedStatement) throws SQLException {
//
//            }
//        });
//        /*
//        调用函数，执行删除操作
//         */
//        jdbcUtil.updateByPreparedStatement(delete, new SetParams() {
//            @Override
//            public void doSet(PreparedStatement preparedStatement) throws SQLException {
//
//            }
//        });
//        jdbcUtil.releaseConn();
//
   }
}
